// 基本思路：设定两个指针left和right，分别指向窗口的左右边界，最开始都指向0位置，保证窗口中没有重复字符，从right从0开始将右侧字符加入到当前窗口window中，记录个数
// 如果该窗口中该字符的个数大于1，则不断右移left，缩小滑动窗口长度，并更新窗口对应字符的个数，直到right越界

// 时间复杂度，O(n)
// 空间复杂度：O(字符集的大小)

function lengthOfLongestSubstring(s) {
    let arr = s.split('')
    let left = 0
    let right = 0
    let window = {}
    let ans = 0

    while (right < arr.length) {
        if (!window[arr[right]]) {
            window[arr[right]] = 1
        } else {
            window[arr[right]] += 1
        }
        while (window[arr[right]] > 1) {
            window[arr[left]] -= 1
            left += 1
        }
        ans = Math.max(ans, right - left + 1)
        right += 1
    }
    return ans
}

let str = "abcaacbb"
console.log(lengthOfLongestSubstring(str))